home *** CD-ROM | disk | FTP | other *** search
- #
- # This file is part of OpenVIP (http://openvip.sourceforge.net)
- #
- # Copyright (C) 2002-2003
- # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
- #
- # This program is licensed under GNU General Public License version 2;
- # see file COPYING in the top level directory for details.
- #
- # $Id: OutputSettingsDialog.py,v 1.13 2004/01/26 22:13:04 tony_slavik Exp $
- #
-
- from wxPython.wx import *
- import globals, worker, openvip
-
- ID_PLUGIN = wxNewId()
- ID_OUTFILE = wxNewId()
- ID_ENABLEAUDIO = wxNewId()
- ID_ENABLEVIDEO = wxNewId()
- ID_VIEWER = wxNewId()
-
- class OutputSettingsDialog(wxDialog):
- """Dialog with rendering options. It includes some basic settings
- such as filename, width, height etc. In addition it displays
- output-plugin-specific panel for setting its parameters."""
- def __init__(self, *args, **kwds):
- # begin wxGlade: OutputSettingsDialog.__init__
- kwds["style"] = wxDEFAULT_DIALOG_STYLE
- wxDialog.__init__(self, *args, **kwds)
- self.label_6_copy = wxStaticText(self, -1, "Output filename")
- self.output_filename = wxTextCtrl(self, -1, "")
- self.select_filename = wxButton(self, ID_OUTFILE, "...")
- self.render_radio = wxRadioBox(self, -1, "Render ...", choices=["Whole timeline", "Only selection"], majorDimension=0, style=wxRA_SPECIFY_COLS)
- self.use_viewer = wxCheckBox(self, -1, "External viewer")
- self.viewer = wxTextCtrl(self, -1, "")
- self.viewer_select = wxButton(self, ID_VIEWER, "...")
- self.static_line_1_copy = wxStaticLine(self, -1)
- self.enable_video = wxCheckBox(self, ID_ENABLEVIDEO, "Enable video track")
- self.video_dims = wxStaticText(self, -1, "Video dimensions")
- self.video_width = wxSpinCtrl(self, -1, "320", min=1, max=10000)
- self.video_height = wxSpinCtrl(self, -1, "180", min=1, max=10000)
- self.label_6_copy_1_copy = wxStaticText(self, -1, "Video FPS")
- self.video_fps = wxSpinCtrl(self, -1, "24", min=1, max=100, style=wxSP_ARROW_KEYS)
- self.enable_audio = wxCheckBox(self, ID_ENABLEAUDIO, "Enable audio track")
- self.label_6_copy_2 = wxStaticText(self, -1, "Audio channels")
- self.channels_choice = wxChoice(self, -1, choices=["mono", "stereo"])
- self.audio_samplerate_text = wxStaticText(self, -1, "Audio sample rate [Hz] ")
- self.audio_samplerate = wxComboBox(self, -1, choices=["11025", "22050", "44100"], style=wxCB_DROPDOWN)
- self.static_line_1 = wxStaticLine(self, -1)
- self.label_6 = wxStaticText(self, -1, "Select output plugin")
- self.plugin_choice = wxChoice(self, ID_PLUGIN, choices=["choice 1"])
- self.panel = wxPanel(self, -1)
- self.ok = wxButton(self, wxID_OK, "OK")
- self.cancel = wxButton(self, wxID_CANCEL, "Cancel")
-
- self.__set_properties()
- self.__do_layout()
- # end wxGlade
- lib = globals.core
- self.plugins_list = lib.enum_plugins(openvip.PLUGIN_OUTPUT)
- self.plugin_choice.Clear()
- for p in self.plugins_list:
- self.plugin_choice.Append(p.name)
- ff=self.plugin_choice.FindString('FFMpeg')
- if ff!=wxNOT_FOUND:
- self.plugin_choice.SetSelection(ff)
- else:
- self.plugin_choice.SetSelection(0)
- self.LoadContent(self.plugin_choice.GetStringSelection()+'Output')
- EVT_CHOICE(self,ID_PLUGIN,self.OnChange)
- EVT_BUTTON(self,ID_OUTFILE,self.OnFilename)
- EVT_BUTTON(self,ID_VIEWER,self.OnViewer)
- EVT_CHECKBOX(self, ID_ENABLEAUDIO, self.OnEnableAudio)
- EVT_CHECKBOX(self, ID_ENABLEVIDEO, self.OnEnableVideo)
-
- def __set_properties(self):
- # begin wxGlade: OutputSettingsDialog.__set_properties
- self.SetTitle("Output plugin settings")
- self.select_filename.SetSize((20,20))
- self.render_radio.SetSelection(0)
- self.viewer.SetSize((130, -1))
- self.viewer_select.SetSize((20,20))
- self.enable_video.SetValue(1)
- self.video_width.SetSize((70, 20))
- self.video_height.SetSize((70, 20))
- self.video_fps.SetSize((70, 20))
- self.enable_audio.SetValue(1)
- self.channels_choice.SetSelection(1)
- self.audio_samplerate.SetSelection(1)
- self.plugin_choice.SetSelection(0)
- self.ok.SetDefault()
- # end wxGlade
-
- def __do_layout(self):
- # begin wxGlade: OutputSettingsDialog.__do_layout
- sizer_4 = wxBoxSizer(wxVERTICAL)
- sizer_7 = wxBoxSizer(wxHORIZONTAL)
- sizer_2 = wxBoxSizer(wxHORIZONTAL)
- sizer_8 = wxBoxSizer(wxHORIZONTAL)
- sizer_8_copy_1_copy_copy = wxBoxSizer(wxHORIZONTAL)
- sizer_8_copy_2 = wxBoxSizer(wxHORIZONTAL)
- sizer_1_copy = wxBoxSizer(wxHORIZONTAL)
- sizer_8_copy_1_copy = wxBoxSizer(wxHORIZONTAL)
- sizer_8_copy_1 = wxBoxSizer(wxHORIZONTAL)
- sizer_1 = wxBoxSizer(wxHORIZONTAL)
- sizer_8_copy_copy = wxBoxSizer(wxHORIZONTAL)
- sizer_8_copy = wxBoxSizer(wxHORIZONTAL)
- sizer_8_copy.Add(self.label_6_copy, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_8_copy.Add(self.output_filename, 0, wxALIGN_CENTER_VERTICAL, 0)
- sizer_8_copy.Add(self.select_filename, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_8_copy, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(self.render_radio, 0, wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 20)
- sizer_8_copy_copy.Add(self.use_viewer, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_8_copy_copy.Add(self.viewer, 0, wxALIGN_CENTER_VERTICAL, 0)
- sizer_8_copy_copy.Add(self.viewer_select, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_8_copy_copy, 0, wxBOTTOM, 20)
- sizer_4.Add(self.static_line_1_copy, 0, wxBOTTOM|wxEXPAND, 10)
- sizer_1.Add(self.enable_video, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_1, 0, wxBOTTOM, 10)
- sizer_8_copy_1.Add(self.video_dims, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_8_copy_1.Add(self.video_width, 0, wxALIGN_CENTER_VERTICAL, 0)
- sizer_8_copy_1.Add(self.video_height, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_8_copy_1, 0, wxBOTTOM|wxALIGN_CENTER_VERTICAL, 10)
- sizer_8_copy_1_copy.Add(self.label_6_copy_1_copy, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_8_copy_1_copy.Add(self.video_fps, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_8_copy_1_copy, 0, wxBOTTOM|wxALIGN_CENTER_VERTICAL, 20)
- sizer_1_copy.Add(self.enable_audio, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_1_copy, 0, wxBOTTOM, 10)
- sizer_8_copy_2.Add(self.label_6_copy_2, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_8_copy_2.Add(self.channels_choice, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_8_copy_2, 0, wxBOTTOM|wxALIGN_CENTER_VERTICAL, 10)
- sizer_8_copy_1_copy_copy.Add(self.audio_samplerate_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_8_copy_1_copy_copy.Add(self.audio_samplerate, 0, wxRIGHT, 20)
- sizer_4.Add(sizer_8_copy_1_copy_copy, 0, wxBOTTOM|wxALIGN_CENTER_VERTICAL, 10)
- sizer_4.Add(self.static_line_1, 0, wxEXPAND, 0)
- sizer_8.Add(self.label_6, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_8.Add(self.plugin_choice, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_8, 0, wxTOP|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 10)
- sizer_2.Add(self.panel, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL, 20)
- sizer_4.Add(sizer_2, 1, wxTOP|wxBOTTOM|wxEXPAND, 20)
- sizer_7.Add(self.ok, 0, wxLEFT|wxRIGHT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_7.Add(self.cancel, 0, wxRIGHT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 20)
- sizer_4.Add(sizer_7, 0, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL, 20)
- self.SetAutoLayout(1)
- self.SetSizer(sizer_4)
- sizer_4.Fit(self)
- sizer_4.SetSizeHints(self)
- self.Layout()
- # end wxGlade
-
- def OnEnableAudio(self, event):
- e=self.enable_audio.IsChecked()
- self.audio_samplerate.Enable(e)
- self.channels_choice.Enable(e)
-
- def OnEnableVideo(self, event):
- e=self.enable_video.IsChecked()
- self.video_width.Enable(e)
- self.video_height.Enable(e)
- self.video_fps.Enable(e)
-
- def LoadContent(self, plugin):
- """Loads the plugin-specific panel. These panels are located in
- settings_dlgs directory and denominated <classname>.py."""
- try:
- exec 'import settings_dlgs.%s' % plugin
- except ImportError:
- wxLogError("No settings available for '%s'." % plugin)
- return False
- try:
- panel = eval('settings_dlgs.%s.getPanel(self,self.panel)' % plugin)
- except NameError:
- wxLogError("No settings available for '%s'." % plugin)
- return False
- psizer = wxBoxSizer(wxHORIZONTAL)
- psizer.Add(panel, 1, wxEXPAND)
- self.panel.SetAutoLayout(1)
- self.panel.SetSizer(psizer)
- psizer.Fit(self.panel)
- psizer.SetSizeHints(self.panel)
- self.panel.Layout()
- self.__do_layout()
- self.SetTitle('Output plugin settings: %s' % (self.plugin_choice.GetStringSelection()))
- self.plugin = plugin
- self.plugin_panel = panel
- return True
-
- def OnChange(self, event):
- self.LoadContent(self.plugin_choice.GetStringSelection()+'Output')
-
- def OnFilename(self, event):
- ret = wxFileSelector('Render to ...', flags=wxSAVE|wxOVERWRITE_PROMPT)
- if ret == '':
- return
- self.output_filename.SetValue(ret)
-
- def OnViewer(self, event):
- ret = wxFileSelector('Select viewer application ...', flags=wxFILE_MUST_EXIST)
- if ret == '':
- return
- self.viewer.SetValue(ret)
-
- def GetParams(self):
- return self.plugin_panel.GetParams()
-
- # The following methods return a boolean value indicating whether we are
- # saving video and/or audio stream. The output plugin must support this stream
- # and the corresponding checkbox must be toggled on.
-
- def HasAudio(self):
- return self.enable_audio.IsChecked()
-
- def HasVideo(self):
- return self.enable_video.IsChecked()
-
- # end of class OutputSettingsDialog
-
-
- # ---------------- testing code -----------------
- if __name__ == '__main__':
- import sys
- class MyApp(wxApp):
- def OnInit(self):
- dlg = OutputSettingsDialog(None, -1, "")
- dlg.ShowModal()
- return False
- wxInitAllImageHandlers()
- app = MyApp(0)
- app.MainLoop()
-